package regulation;

import capteurs.CPresence;
import capteurs.Capteur;
import rails.JAiguillage;
import rails.Rail;
import semaphores.Bicolore;
import semaphores.Rouge;
import semaphores.Vert;

/**
 * Un type de r�gulation avec la configuration physique suivante :
 * _Un aiguillage avec trois rails amont et deux rails aval.
 * _Un capteur de pr�sence sur chaque rail aval.
 * _Un feu bicolore sur chaque rail aval devant jonction2.
 * 
 * @author BERNARD Arthur, DELAMARCHE J�r�me, LE STER Olivier, PAVAGEAU Max
 *
 */

public class RegulationT1 extends Regulation {
	private JAiguillage aiguillage;
	private CPresence capteurs[];
	private Bicolore bicolores[];

	public RegulationT1() {
		aiguillage = null;
		capteurs = new CPresence[2];
		bicolores = new Bicolore[2];
	}
	
	public void setAguillage(JAiguillage aiguillage) {
		this.aiguillage = aiguillage;
	}
	
	public void setCapteurs(CPresence[] capteurs) {
		this.capteurs = capteurs;
	}
	
	public void setBicolore(Bicolore[] bicolores) {
		this.bicolores = bicolores;
	}
	
	public void onPresenceChange(Capteur capteur, boolean presence) {
		actionRegulation(capteur, presence, -1);
	}

	public void onVitesseChange(Capteur capteur, int vitesse) {
	}

	protected void actionRegulation(Capteur capteur, boolean presence, int vitesse) {
		int i;
		
		if(capteur.equals(capteurs[0]))
			i = 0;
		else
			i = 1;
		
		if(presence) { //On a rep�r� un train !
			Rail tmpRail = capteurs[i].getRail();
			
			if(tmpRail.equals(aiguillage.getSortieAval())) {
				bicolores[i].setState(Vert.getInstance());
				bicolores[(i+1)%2].setState(Rouge.getInstance());
				System.out.println("J'ai changé les couleurs de feux !");
			}
			else {
				bicolores[(i+1)%2].setState(Rouge.getInstance());
				aiguillage.setSortieAval(tmpRail);
				bicolores[i].setState(Vert.getInstance());
				System.out.println("J'ai changé les couleurs de feux et l'aiguillage !");
			}
		}
	}
}
